// 1. 预处理指令：确保头文件只被编译一次（替代传统的#ifndef/#define/#endif防护）
#pragma once

// 2. 包含标准库头文件：
#include <mutex>                  // 提供互斥锁（std::mutex），用于线程同步
#include <vector>                 // 提供动态数组（std::vector），用于存储任务队列和线程实例
#include <functional>             // 提供函数包装器（std::function），用于存储可执行任务
#include <condition_variable>     // 提供条件变量（std::condition_variable），用于线程等待/唤醒
#include <map>                    // 提供映射容器（未直接使用，可能预留或依赖）
#include <chrono>                 // 提供时间相关类型（如std::chrono::duration），用于定时操作
#include <iostream>               // 提供输入输出（未直接使用，可能用于调试）
#include <thread>                 // 提供线程相关类型（如std::thread），用于线程管理

// 3. 注释：屏蔽的头文件（可能暂时不需要或已废弃）
// #include "eventcommand.h"

// 4. 定义命名空间DcAdr：封装该模块的类和枚举，避免命名冲突
namespace DcAdr
{
    // 5. 定义线程类型枚举类：区分不同功能的线程，便于管理和获取对应事件循环
    enum class ThreadType : uint8_t
    {
        E_InMainThread,           // 0. 主线程（dc_loop）：核心事件循环
        E_InDataDealThread,       // 1. 数据处理线程（dc_cache）：接收、处理、缓存数据
        // E_InTriggerThread,        // 2. 条件触发线程（已注释，可能废弃）：处理事件触发判断
        E_InFileCacehThread,      // 3. 文件缓存线程（dc_fileCache）：文件缓存、落盘、处理、事件上传
        E_InFileUploadThread,     // 4. 文件上传线程（dc_fileupload）：专用文件上传功能
        E_InVideoAntianaphylaxis, // 5. 视频脱敏线程（dc_dense）：处理视频文件脱敏
        E_SignalCollect,          // 6. 信号采集线程（dc_signal）：采集系统信号
        E_SignalCollect_2,        // 7. 信号采集线程2（dc_signal_2）：备用或扩展的信号采集
        E_SendSignal,             // 8. 信号发送线程（dc_sendsignal）：周期性发送采集的信号
        E_VideoSend,              // 9. 视频发送线程（dc_vediosend）：哨塔营地模式下发送视频数据到edc
        E_ThreadCount             // 线程总数（必须放最后）：用于初始化时创建对应数量的线程
    };

    // 6. 前向声明EventCommond类：告知编译器该类存在，避免因交叉引用导致的编译错误
    class EventCommond;

    // 7. 定义EventLoop类：事件循环核心类，管理线程内的任务队列和事件处理
    class EventLoop
    {
        // 8. 声明EventCommand为友元类：允许EventCommand访问EventLoop的私有成员（如任务队列）
        friend class EventCommand;

    public:
        // 9. 成员函数：判断事件循环是否正在运行
        bool isRunning()
        {
            return m_isRunning;
        }

        // 10. 成员函数声明：事件循环主函数（实际实现见cpp文件，循环处理任务队列）
        void exec();

        // 11. 模板成员函数：等待指定时间后执行一次任务队列中的所有任务
        //     模板参数_Rep和_Period用于指定时间单位（如毫秒、秒）
        template <typename _Rep, typename _Period>
        void execOnce(const std::chrono::duration<_Rep, _Period> &time)
        {
            std::vector<std::function<void()>> func;  // 临时存储待执行任务
            {
                std::unique_lock<std::mutex> lock(m_mutex);  // 加锁保护任务队列
                m_cond.wait_for(lock, time);  // 等待指定时间（期间释放锁，避免阻塞）
                func.swap(m_queue);  // 交换队列内容，将任务转移到临时容器
            }
            // 执行所有任务（此时已解锁，提高并发效率）
            for (auto &item : func)
                item();
        }

        // 12. 静态成员函数声明：初始化所有线程的EventLoop实例（创建线程并关联事件循环）
        static void init();

        // 13. 静态成员函数声明：根据ThreadType获取对应线程的EventLoop实例（单例模式）
        static std::shared_ptr<EventLoop> getInstance(ThreadType);

        // 14. 析构函数声明：释放EventLoop资源
        ~EventLoop();

        // 15. 构造函数声明：初始化EventLoop成员
        EventLoop();

    private:
        // 注：此处private后接public:可能是笔误，实际应为私有成员
    public:
        bool m_isRunning;  // 16. 事件循环运行标志（true表示运行中，false表示停止）
        std::mutex m_mutex;  // 17. 互斥锁：保护任务队列m_queue的线程安全访问
        std::condition_variable m_cond;  // 18. 条件变量：用于线程等待任务（无任务时阻塞，有任务时唤醒）
        std::vector<std::function<void(void)>> m_queue;  // 19. 任务队列：存储待执行的函数对象（注释为"延时队列"，可能支持定时任务）
        static std::vector<std::shared_ptr<EventLoop>> m_loops;  // 20. 静态容器：存储所有线程的EventLoop实例（按ThreadType索引）
    };
} // namespace DcAdr  // 21. 命名空间结束